package demo;

/**
 * 题目：
 *  1. 按顺序打印出：矩形，圆，三角形
 *  2. 按顺序打印出：矩形，圆，矩形，圆，三角形
 */
class Shape{
    public void draw(){
        System.out.println("画图形");
    }
}
class rectangle extends Shape{
    @Override
    public void draw() {
        System.out.println("画矩形");
    }
}
class Circle extends Shape{
    @Override
    public void draw() {
        System.out.println("画圆");
    }
}
class Triangle extends Shape{
    @Override
    public void draw() {
        System.out.println("画三角形");
    }
}
public class Test {
    /**
     * 第一题：
     *
     * 一个引用，调用同一个方法，因为引用的子类对象不一样，
     *  所以调用这个方法后，表现出来的行为就不一样
     */
    public static void drawFuc(Shape shape){
        shape.draw();
    }

    /**
     *  第二题：
     */
    public static void drawShapes(Shape shape){
        shape.draw();
    }

    public static void main(String[] args) {
        /**
         * 第一题做法：按顺序打印出：矩形，圆，三角形
         *
         * 传参
         * 1. 直接传父类类型的引用，，由父类类型接收
         * 2. 传子类类型的引用 传过去会发生自动类型转换，由父类类型接收
         * 3. 直接传匿名对象，传过去会发生自动类型转换，由父类类型接收
         */
        Shape shape = new rectangle();
        drawFuc(shape);
        Circle circle = new Circle();
        drawFuc(circle);
        drawFuc(new Triangle());
        System.out.println("----------------------");
        /**
         *  第二题做法：按顺序打印出：矩形，圆，矩形，圆，三角形
         *  传不同的对象，会产生不同的行为
         */
        drawShapes(new rectangle());
        drawShapes(new Circle());
        drawShapes(new rectangle());
        drawShapes(new Circle());
        drawShapes(new Triangle());
        //改进后:把对象存在数组中，遍历数组
        System.out.println("---------改进后----------------");
        Shape[] shapes = {new rectangle(),new Circle(),new rectangle(),new Circle(),new  Triangle()};//这串代码就发生了向上转型
        for (Shape s:shapes) {
           // drawShapes(s);//调用了方法drawShapes进行传参
            s.draw();    // 遍历数组赋值，s中已经是不同的子类对象了，
                         // 所以不传参也可以，直接调用draw方法，不同的对象会产生不同的行为

        }

    }
}
